/*
    errorHandler: 组件渲染方法执行期间及侦听器抛出的未捕获错误,可以获取到错误信息和应用实例
    app.config.errorHandle = (err, vm, info) => {
        // err:
        // vm:
        // info: 是vue特定的错误信息，比如错误所在的生命周期钩子
    }

    warnHandler: 警告指定一个自定义处理函数，只有在开发环境生效，生产环境会被忽略
    app.config.warnHandle = function(msg, vm, trace) => {
        // msg: 警告信息
        // vm: 组件实例
        // trace: 是组件的继承关系追踪
    }

    globalProperties: 向任何组件实例中添加可全局访问的属性
    在vue2中: vue.prototype.$http = () => {}
    在vue3中: app.config.globalproperties.$http = () => {}

    isCustomElement: 用来识别Vue之外定义的自定义元素，如果组件符合此条件则不需要本地或全局注册，并且Vue不会抛出 Unknown custon element的警告

    app.config.isCustomElement = tag => tag.startWith('icon-')

    optionMergeStrategies: 自定义选项合并策略

    const app = Vue.createApp({
        custom: 'hello!'
    })

    // 注意这里返回的先后顺序，他会影响混入中打印出的结果
    写法一: app.config.optionMergeStrategies.custom = (toVal, fromVal) => fromVal || toVal
    写法二: app.config.optionMergeStrategies.custom = (toVal, fromVal) => toVal || fromVal

    app.mixin({
    custom: 'goodbye!',
    created() {
        console.log(this.$options.custom) //  写法一会打印出"hello",       写法二会打印出 "goodbye!"
    }
    })
    performance: 在浏览器开发工具中的performance/timeline面板中启用对组件初始化、编译渲染和更新的性能追踪，但是只适用于performance.mark API的浏览器
    app.config.performance = true
*/

import type { ComponentInternalInstance } from 'vue'

function useCurrentInstance() {
  const { appContext, proxy }
    = getCurrentInstance() as ComponentInternalInstance
  // console.log(getCurrentInstance());

  const { globalProperties } = appContext.config
  return {
    globalProperties,
    proxy,
    ...globalProperties,
  }
}

export default useCurrentInstance
